package com.tool.cn.util;

import java.lang.reflect.Field;
import java.net.URL;

/**
 * 加载类工具类
 * 
 * @author wangzh 2018年7月3日 上午10:39:25
 */
public class ClassUtil {

	public static ClassLoader getClassLoader() {
		return Thread.currentThread().getContextClassLoader();
	}

	public static String getClassPath() {
		String classpath = "";
		URL resource = getClassLoader().getResource("");
		if (resource != null) {
			classpath = resource.getPath();
		}
		return classpath;
	}

	/**
	 * 包名+类名字符串获取class对象，通过newInstance 默认无参构造函数初始化
	 * @param className 带包名类名
	 * @return
	 */
	public static Class<?> loadClass(String className) {
		Class<?> cls;
		try {
			cls= Class.forName(className);
		} catch (ClassNotFoundException e) {
			System.err.println("加载类出错！");
			throw new RuntimeException(e);
		}
		return cls;
	}

	/**
	 * class 是否为int
	 * 
	 * @param type
	 * @return
	 */
	public static boolean isInt(Class<?> type) {
		return (type.equals(Integer.TYPE)) || (type.equals(Integer.class));
	}

	/**
	 * class 是否为long
	 * 
	 * @param type
	 * @return
	 */
	public static boolean isLong(Class<?> type) {
		return (type.equals(Long.TYPE)) || (type.equals(Long.class));
	}

	/**
	 * class 是否为double
	 * 
	 * @param type
	 * @return
	 */
	public static boolean isDouble(Class<?> type) {
		return (type.equals(Double.TYPE)) || (type.equals(Double.class));
	}

	/**
	 * class 是否为string
	 * 
	 * @param type
	 * @return
	 */
	public static boolean isString(Class<?> type) {
		return type.equals(String.class);
	}
	
	/**
	 * class转包名加类名字符串
	 * @param className
	 * @return
	 */
	public static String getPackagePath(Class<?> className) {
		return className.getName();
	}

	/**
	 * 获取类的属性 信息
	 * @param obj必须完成new 初始化
	 */
	public static void readAttributeValue(Object obj) {
		String nameValues = "";
		// 得到class
		Class<?> cls = obj.getClass();
		// 得到所有属性
		Field[] fields = cls.getDeclaredFields();
		for (int i = 0; i < fields.length; i++) {// 遍历
			try {
				
				if(i>0) {
					nameValues+=",\n";
				}
				// 得到属性
				Field field = fields[i];
				// 打开私有访问
				field.setAccessible(true);
				// 获取属性值
				Object value = field.get(obj);

				//修饰符 无修饰 0 public 1 private 2 protected 4 
				nameValues +="完整字符串："+field.toString()+" 名字:"+ field.getName() + " 值：" + value +" 类型"+field.getType()+" 修饰符"+field.getModifiers();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		}
		System.out.println(nameValues);
	}

}
